package avicit.bdp.dgs.qa.utils.tools;

import avicit.bdp.dgs.qa.dto.FtdpFileDTO;
import avicit.bdp.dgs.qa.dto.RuleTemplateDTO;

import avicit.bdp.dgs.qa.utils.enums.FileType;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @金航数码科技有限责任公司
 * @作者：developer
 * @邮箱：developer@avic-digital.com
 * @创建时间： 2023-10-10
 * @类说明：FileAdapterUtils
 * @修改记录：
 * @注意事项：
 * @主要功能：文件校验工具类。根据试飞原始文件类型或工程值数据类型，自动检测对应的规则模板
 */
public class FileAdapterUtils {
    private static final Logger logger = LoggerFactory.getLogger(FileAdapterUtils.class);

    /**
     * 试飞原始文件数据格式，包括PCM/INET/1553B/FCS
     */
    public static final String DATA_PROP_PCM = "PCM";
    public static final String DATA_PROP_INET = "INET";
    public static final String DATA_PROP_1553B = "1553B";
    public static final String DATA_PROP_FCS = "1553B";

    /**
     * 自动检测对应的规则模板
     *
     * @param fileType     文件类型，0：试飞原始文件、1：工程值数据
     * @param dataProp     数据类型，包括PCM、INET、1153B、FC
     * @param templateList 内置的文件校验模板列表
     * @param fileList     待校验文件列表
     * @return
     */
    public static Map<String, List<FtdpFileDTO>> detectTemplate(Integer fileType,
                                                                String dataProp,
                                                                List<RuleTemplateDTO> templateList,
                                                                List<FtdpFileDTO> fileList) {
        FileType type = FileType.getTypeByCode(fileType);
        if (fileType == null) {
            logger.error("文件类型为空，无法获取内置模板.");
            return new HashMap<>();
        }
        if (FileType.RAW_DATA == type) {
            if (StringUtils.isEmpty(dataProp)) {
                logger.error("数据类型为空，无法获取内置模板.");
                return new HashMap<>();
            }
        }
        if (CollectionUtils.isEmpty(templateList)) {
            logger.warn("内置模板列表为空，无法获取内置模板.");
            return new HashMap<>();
        }
        if (CollectionUtils.isEmpty(fileList)) {
            logger.warn("待校验文件列表为空，无法获取内置模板.");
            return new HashMap<>();
        }

        switch (type) {
            case RAW_DATA:
                return detectRawDataTemplate(fileType, dataProp, templateList, fileList);
            case PROCESS_DATA:
                return detectProcessedDataTemplate(fileType, dataProp, templateList, fileList);
            default:
                logger.error("暂不支持当前文件类型,fileType:" + fileType);
                return new HashMap<>();
        }
    }

    /**
     * 试飞原始数据，自动获取内置模板
     * 注意：
     * 1、试飞原始数据，仅需要根据文件类型、数据类型确定内置模板；
     * 2、试飞原始数据仅对应一个模板；
     *
     * @param fileType
     * @param dataProp
     * @param templateList
     * @param fileList
     * @return
     */
    private static Map<String, List<FtdpFileDTO>> detectRawDataTemplate(Integer fileType,
                                                                        String dataProp,
                                                                        List<RuleTemplateDTO> templateList,
                                                                        List<FtdpFileDTO> fileList) {
        Map<String, List<FtdpFileDTO>> resultMap = new HashMap<>(8);

        for (RuleTemplateDTO template : templateList) {
            if (template == null) {
                continue;
            }

            // 内置模板类型，根据算法algoType确定模板内中
            if (template.getAlgoType() == 0) {
                // 当前仅支持PCM格式校验
                if ( DATA_PROP_PCM.equals(dataProp.toUpperCase())) {
                    resultMap.put(template.getId(), fileList);
                }
            }
        }

        logger.info("当前仅支持PCM数据类型的试飞原始文件校验");

        return resultMap;
    }

    /**
     * 工程值数据，自动获取内置模板
     * 注意：
     * 1、工程值数据校验仅对应一个模板，根据文件采集-文件模板，自动匹配工程值数据，然后进行校验；
     * 2、工程值数据都是csv等格式；
     *
     * @param fileType
     * @param dataProp
     * @param templateList
     * @param fileList
     * @return
     */
    private static Map<String, List<FtdpFileDTO>> detectProcessedDataTemplate(Integer fileType,
                                                                              String dataProp,
                                                                              List<RuleTemplateDTO> templateList,
                                                                              List<FtdpFileDTO> fileList) {
        Map<String, List<FtdpFileDTO>> resultMap = new HashMap<>(8);

        for (RuleTemplateDTO template : templateList) {
            if (template == null) {
                continue;
            }

            // 内置模板类型，根据算法algoType确定模板内中
            if (template.getAlgoType() == 1) {
                resultMap.put(template.getId(), fileList);
            }
        }

        return resultMap;
    }
}
